package com.medicine.hbp.http;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.UUID;

import org.json.JSONException;
import org.json.JSONObject;

import com.medicine.hbp.sp.LoginSp;
import com.medicine.hbp.uitl.MD5;

import android.os.AsyncTask;
import android.text.TextUtils;
import android.util.Log;

/**
 * 上传文件到服务器类
 *
 * @author tom
 */
public class UploadUtil {
	private static final String TAG = "uploadFile";

	private static final int TIME_OUT = 10 * 1000; // 超时时间

	private static final String CHARSET = "utf-8"; // 设置编码

	private static String datas;
	private static String seq;
	/**
	 * Android上传文件到服务端
	 *
	 * @param file
	 *            需要上传的文件
	 * @param RequestURL
	 *            请求的rul
	 * @return 返回响应的内容
	 */
	public static void uploadFile(final File file, String RequestURL,
								  final ImageCallBack back) {
//		final Map<String, String> param =new HashMap<String, String>();
//		datas=MD5.getData();
//		seq=MD5.getSeq("85148429", datas);
//		param.put("datetime",datas);//当前时间long的值
//		param.put("seq", seq);
//		param.put("platformPwd", MD5.getMD5String(seq+"A956B2EEDB"));//当前时间long的值
//		param.put("appNameId", "85148429");//所属应用ID(用于替换appName)
		new AsyncTask<String, Void, String>() {
			@Override
			protected String doInBackground(String... params) {
				String result = null;
				String BOUNDARY = UUID.randomUUID().toString(); // 边界标识 随机生成
				String PREFIX = "--", LINE_END = "\r\n";
				String CONTENT_TYPE = "multipart/form-data"; // 内容类型

				try {
					URL url = new URL(params[0]);
					HttpURLConnection conn = (HttpURLConnection) url.openConnection();


					conn.setReadTimeout(TIME_OUT);
					conn.setConnectTimeout(TIME_OUT);
					conn.setDoInput(true); // 允许输入流
					conn.setDoOutput(true); // 允许输出流
					conn.setUseCaches(false); // 不允许使用缓存
					conn.setRequestMethod("POST"); // 请求方式
					conn.setRequestProperty("Charset", CHARSET); // 设置编码
					conn.setRequestProperty("connection", "keep-alive");
					conn.setRequestProperty("Content-Type", CONTENT_TYPE+ ";boundary=" + BOUNDARY);

//					conn.setRequestProperty("datetime",datas);
//					conn.setRequestProperty("seq", seq);
//					conn.setRequestProperty("platformPwd", MD5.getMD5String(seq+"A956B2EEDB"));
//					conn.setRequestProperty("appNameId", "85148429");
//					conn.setRequestProperty("appType", "Android");
					if (file != null) {
						/**
						 * 当文件不为空，把文件包装并且上传
						 */
						DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
						StringBuffer sb = null;
//						String params1= "";
//						/***
//						 * 以下是用于上传参数
//						 */
//						if (param != null && param.size() > 0) {
//							Iterator<String> it = param.keySet().iterator();
//							while (it.hasNext()) {
//								sb = null;
//								sb = new StringBuffer();
//								String key = it.next();
//								String value = param.get(key);
//								sb.append(PREFIX).append(BOUNDARY)
//										.append(LINE_END);
//								sb.append("Content-Disposition: form-data; name=\"").append(key).append("\"").append(LINE_END).append(LINE_END);
//								sb.append(value).append(LINE_END);
//								params1 = sb.toString();
//								Log.i(TAG, key + "=" + params + "##");
//								dos.write(params1.getBytes());
//								// dos.flush();
//							}
//						}
//						sb = null;
						sb = new StringBuffer();
						sb.append(PREFIX);
						sb.append(BOUNDARY);
						sb.append(LINE_END);
						/**
						 * 这里重点注意： name里面的值为服务端需要key 只有这个key 才可以得到对应的文件
						 * filename是文件的名字，包含后缀名的 比如:abc.png
						 */

						sb.append("Content-Disposition: form-data; name=\"uploadfile\"; filename=\""
								+ file.getName() + "\"" + LINE_END);
						sb.append("Content-Type: application/octet-stream; charset="
								+ CHARSET + LINE_END);
						sb.append(LINE_END);
						dos.write(sb.toString().getBytes());
						InputStream is = new FileInputStream(file);
						byte[] bytes = new byte[1024];
						int len = 0;
						while ((len = is.read(bytes)) != -1) {
							dos.write(bytes, 0, len);
						}
						is.close();
						dos.write(LINE_END.getBytes());
						byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINE_END)
								.getBytes();
						dos.write(end_data);
						dos.flush();
						/**
						 * 获取响应码 200=成功 当响应成功，获取响应的流
						 */
						int res = conn.getResponseCode();
						Log.e(TAG, "response code:" + res);
						// if(res==200)
						// {
						Log.e(TAG, "request success");
						InputStream input = conn.getInputStream();
						StringBuffer sb1 = new StringBuffer();
						int ss;
						while ((ss = input.read()) != -1) {
							sb1.append((char) ss);
						}
						result = sb1.toString();
						Log.e(TAG, "result : " + result);
						// }
						// else{
						// Log.e(TAG, "request error");
						// }
					}
				} catch (MalformedURLException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				}
				return result;
			}

			@Override
			protected void onPostExecute(String result) {
				try {
					JSONObject jsonObject = new JSONObject(result);
					if (jsonObject.getBoolean("isSuccess")) {
						if (TextUtils.isEmpty(jsonObject.getString("fileUrl"))) {
							back.onFailure("文件上传错误");
						} else {
							back.onSuccess(jsonObject.getString("fileUrl"));
						}
					} else {
						back.onFailure("文件上传失败");
					}
				} catch (Exception e) {
					e.printStackTrace();
					back.onFailure("文件上传错误");
				}
				super.onPostExecute(result);
			}
		}.execute(RequestURL);

	}

	/**
	 * 通过拼接的方式构造请求内容，实现参数传输以及文件传输
	 *
	 * @param url
	 *            Service net address
	 * @param params
	 *            text content
	 * @param files
	 *            pictures
	 * @return String result of Service response
	 * @throws IOException
	 */
	public static String post(String url, Map<String, String> params,
							  Map<String, File> files) throws IOException {
		String BOUNDARY = java.util.UUID.randomUUID().toString();
		String PREFIX = "--", LINEND = "\r\n";
		String MULTIPART_FROM_DATA = "multipart/form-data";
		String CHARSET = "UTF-8";

		URL uri = new URL(url);
		HttpURLConnection conn = (HttpURLConnection) uri.openConnection();
		conn.setReadTimeout(10 * 1000); // 缓存的最长时间
		conn.setDoInput(true);// 允许输入
		conn.setDoOutput(true);// 允许输出
		conn.setUseCaches(false); // 不允许使用缓存
		conn.setRequestMethod("POST");
		conn.setRequestProperty("connection", "keep-alive");
		conn.setRequestProperty("Charsert", "UTF-8");
		conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA
				+ ";boundary=" + BOUNDARY);

		// 首先组拼文本类型的参数
		StringBuilder sb = new StringBuilder();
		for (Map.Entry<String, String> entry : params.entrySet()) {
			sb.append(PREFIX);
			sb.append(BOUNDARY);
			sb.append(LINEND);
			sb.append("Content-Disposition: form-data; name=\""
					+ entry.getKey() + "\"" + LINEND);
			sb.append("Content-Type: text/plain; charset=" + CHARSET + LINEND);
			sb.append("Content-Transfer-Encoding: 8bit" + LINEND);
			sb.append(LINEND);
			sb.append(entry.getValue());
			sb.append(LINEND);
		}

		DataOutputStream outStream = new DataOutputStream(
				conn.getOutputStream());
		outStream.write(sb.toString().getBytes());
		// 发送文件数据
		if (files != null)
			for (Map.Entry<String, File> file : files.entrySet()) {
				StringBuilder sb1 = new StringBuilder();
				sb1.append(PREFIX);
				sb1.append(BOUNDARY);
				sb1.append(LINEND);
				sb1.append("Content-Disposition: form-data; name=\"uploadfile\"; filename=\""
						+ file.getValue().getName() + "\"" + LINEND);
				sb1.append("Content-Type: application/octet-stream; charset="
						+ CHARSET + LINEND);
				sb1.append(LINEND);
				outStream.write(sb1.toString().getBytes());

				InputStream is = new FileInputStream(file.getValue());
				byte[] buffer = new byte[1024];
				int len = 0;
				while ((len = is.read(buffer)) != -1) {
					outStream.write(buffer, 0, len);
				}

				is.close();
				outStream.write(LINEND.getBytes());
			}

		// 请求结束标志
		byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes();
		outStream.write(end_data);
		outStream.flush();
		BufferedReader br = new BufferedReader(new InputStreamReader(
				conn.getInputStream(), "utf-8"));
		String line = "";
		String result = "";
		while (null != (line = br.readLine())) {
			result += line;
		}
		outStream.close();
		conn.disconnect();
		Log.e("cccc", result);
		return result;
		// // 得到响应码
		// int res = conn.getResponseCode();
		// InputStream in = conn.getInputStream();
		// StringBuilder sb2 = new StringBuilder();
		// if (res == 200) {
		// int ch;
		// while ((ch = in.read()) != -1) {
		// sb2.append((char) ch);
		// }
		// }
		// outStream.close();
		// conn.disconnect();
		// return sb2.toString();
	}

	public interface ImageCallBack {
		public void onSuccess(String url);

		public void onFailure(String error);
	}
}
